/**
 * @addtogroup jtc_msg_808
 * jtc_msg_808_2013_comm
 * @{
 */
 
/**
 * @file         jtc_msg_808_2013_comm.h
 * @brief        交通部消息2013版本通用信息定义
 * @note    
 * @author       Akee
 * @date         2020-06-11
 * @version      1.0
 *
 * @par          修改日志
 * <table>
 * <tr><th>Date        <th>Version               <th>Author          <th>Description
 * <tr><td>2020-06-11  <td>1.0                   <td>Akee            <td>创建初始版本
 * @copyright    杭州鸿泉物联网技术股份有限公司
 */
#ifndef _JTC_MSG_808_2013_COMM_H_
#define _JTC_MSG_808_2013_COMM_H_

#include "ofc/ofc_types.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * 终端(0x0001)/平台通用(0x8001)应答消息体数据格式
 ******************************************************************************
 */
enum TJtMsg808GenRespResultEnumTag
{
    kJtMsg808GenRespOk          = 0,    ///< 成功/确认
    kJtMsg808GenRespFail        = 1,    ///< 失败
    kJtMsg808GenRespInvalidMsg  = 2,    ///< 消息有误
    kJtMsg808GenRespUnsupported = 3,    ///< 不支持
    kJtMsg808GenRespAlarmAck    = 4,    ///< 报警处理确认
};
typedef enum TJtMsg808GenRespResultEnumTag TJtMsg808GenRespResultEnum;

/**
 * 终端控制命令枚举(0x8105)
 ******************************************************************************
 */
enum TJtMsg808TrmCtlCmdEnumTag
{
    kJtMsg808TrmPowerOff             = 3,    ///< 终端关机
    kJtMsg808TrmRestart              = 4,    ///< 终端复位
    kJtMsg808TrmReset                = 5,    ///< 终端恢出厂设置,仅user级别的属性值恢复，执行完成后需要下发重启生效
    kJtMsg808TrmCloseDataCom         = 6,    ///< 关闭数据通信
    kJtMsg808TrmCloseAllWireCom      = 7,    ///< 关闭所有无线通信
    kJtMsg808TrmResetSrtLevelRoot    = 253,  ///< 终端恢复超级及以下级别的属性值，执行完成后需要下发重启生效，一般只有在属性存储异常时才执行该级别恢复
    kJtMsg808TrmResetSrtLevelFactory = 254,  ///< 终端恢复工厂及以下级别的属性值，执行完成后需要下发重启生效
    kJtMsg808TrmResetSrtLevelInstall = 255,  ///< 终端恢复安装及以下级别的属性值，执行完成后需要下发重启生效
};
typedef enum TJtMsg808TrmCtlCmdEnumTag TJtMsg808TrmCtlCmdEnum;

/**
 *  终端升级类型枚举(0x8108)
 ******************************************************************************
 */
enum TJtMsg808TrmUpdateTypeEnumTag
{
    kJtMsg808TrmUpdateTypeTerminal       = 0,                  ///< 终端
    kJtMsg808TrmUpdateTypeIcReader       = 12,                 ///< Ic读卡器
    kJtMsg808TrmUpdateTypeLocationModule = 52,                 ///< 定位模块
};
typedef enum TJtMsg808TrmUpdateTypeEnumTag TJtMsg808TrmUpdateTypeEnum;

/**
 *  终端升级结果枚举(0x0108)
 ******************************************************************************
 */
enum TJtMsg808TrmUpdateResultEnumTag
{
    kJtMsg808TrmUpdateSuccess = 0,                  ///< 成功
    kJtMsg808TrmUpdateFail = 1,                     ///< 失败
    kJtMsg808TrmUpdateCancel = 2,                   ///< 取消
};
typedef enum TJtMsg808TrmUpdateResultEnumTag TJtMsg808TrmUpdateResultEnum;

/**
 * 位置信息汇报状态位定义(0x0200)
 ******************************************************************************
 */
enum TJtMsg808LocationStateEnumTag
{
    kJtMsg808LocatStateAcc                         = (1 << 0),  ///< 0:ACC 关；1:ACC 开
    kJtMsg808LocatStateLocated                     = (1 << 1),  ///< 0:未定位；1:已定位
    kJtMsg808LocatStateGpsLatNs                    = (1 << 2),  ///< 0:北纬；1:南纬
    kJtMsg808LocatStateGpsLongEw                   = (1 << 3),  ///< 0:东经；1:西经
    kJtMsg808LocatStateVehicleOperating            = (1 << 4),  ///< 0:运营状态；1:停运状态
    kJtMsg808LocatStateGpsLongLatEncrypted         = (1 << 5),  ///< 0:经纬度未经保密插件加密；1:经纬度已经保密插件加密
    kJtMsg808LocatStateEmergencyBrakeWar           = (1 << 6),  ///< 1:紧急刹车系统采集的前撞预警,2019增加
    kJtMsg808LocatStateLaneShiftWar                = (1 << 7),  ///< 1:车道偏移预警,2019增加
    kJtMsg808LocatStateCargoStatebit1              = (1 << 8),  ///< 载货状态位1(与载货状态位2合并使用 0-空车， 1-半载，2-保留， 3-满载)
    kJtMsg808LocatStateCargoStatebit2              = (1 << 9),  ///< 载货状态位2(与载货状态位1合并使用 0-空车， 1-半载，2-保留， 3-满载)
    kJtMsg808LocatStateOilCircuit                  = (1 << 10), ///< 0:车辆油路正常；1:车辆油路断开
    kJtMsg808LocatStateElectricCircuit             = (1 << 11), ///< 0:车辆电路正常；1:车辆电路断开
    kJtMsg808LocatStateVehicleDoorLocked           = (1 << 12), ///< 0:车门解锁；1:车门加锁
    kJtMsg808LocatStateNo1DoorState                = (1 << 13), ///< 门1（前门）[0:关;1:开]
    kJtMsg808LocatStateNo2DoorState                = (1 << 14), ///< 门2（中门）[0:关;1:开]
    kJtMsg808LocatStateNo3DoorState                = (1 << 15), ///< 门3（后门）[0:关;1:开]
    kJtMsg808LocatStateNo4DoorState                = (1 << 16), ///< 门4（后门）[0:关;1:开]
    kJtMsg808LocatStateNo5DoorState                = (1 << 17), ///< 门5（后门）[0:关;1:开]
    kJtMsg808LocatStateGpsEn                       = (1 << 18), ///< 是否使用Gps定位
    kJtMsg808LocatStateBdsEn                       = (1 << 19), ///< 是否使用BDS定位
    kJtMsg808LocatStateGlonassEn                   = (1 << 20), ///< 是否使用GLONASS定位
    kJtMsg808LocatStateGalileoEn                   = (1 << 21), ///< 是否使用Galileo定位
    kJtMsg808LocatStateVehicleDrivingState         = (1 << 22), ///< 0:车辆处于停止状态;1：车辆处于行驶状态
};
typedef enum TJtMsg808LocationStateEnumTag TJtMsg808LocationStateEnum;

/**
 * 位置信息汇报报警预警标志位定义(0x0200)
 ******************************************************************************
 */
enum TJtMsg808LocationAlarmEnumTag
{
    kJtMsg808LocationAlarmEmergency                = (1 << 0),  ///< 1: 紧急报警，出动报警开关后触发， 收到应答后清零
    kJtMsg808LocationAlarmOverspeed                = (1 << 1),  ///< 1: 超速报警，标志维持至报警条件解除
    kJtMsg808LocationAlarmFatigueDrv               = (1 << 2),  ///< 1: 疲劳驾驶，标志维持至报警条件解除
    kJtMsg808LocationAlarmEarly                    = (1 << 3),  ///< 1: 危险预警，收到应答后清零
    kJtMsg808LocationAlarmGnssFault                = (1 << 4),  ///< 1: GNSS模块发生故障，标志维持至报警条件解除
    kJtMsg808LocationAlarmGnssCut                  = (1 << 5),  ///< 1: GNSS天线未接货被剪断，标志维持至报警条件解除
    kJtMsg808LocationAlarmGnssShortCircuit         = (1 << 6),  ///< 1: GNSS天线短路，标志维持至报警条件解除
    kJtMsg808LocationAlarmUnderVolMain             = (1 << 7),  ///< 1: 终端主电源欠压，标志维持至报警条件解除
    kJtMsg808LocationAlarmPowerDownMain            = (1 << 8),  ///< 1: 终端主电源掉电，标志维持至报警条件解除
    kJtMsg808LocationAlarmDisplayFault             = (1 << 9),  ///< 1: 终端LCD或显示器故障，标志维持至报警条件解除
    kJtMsg808LocationAlarmTtsFault                 = (1 << 10), ///< 1: TTS模块故障，标志维持至报警条件解除
    kJtMsg808LocationAlarmCameraFault              = (1 << 11), ///< 1: 摄像头故障，标志维持至报警条件解除
    kJtMsg808LocationAlarmIcRderFault              = (1 << 12), ///< 1: 道路运输证IC卡模块故障
    kJtMsg808LocationAlarmSpeedingWarning          = (1 << 13), ///< 1: 超速预警
    kJtMsg808LocationAlarmFatigueDrvWarning        = (1 << 14), ///< 1: 疲驾预警
    kJtMsg808LocationAlarmDrivingViolations        = (1 << 15), ///< 1: 违规行驶报警
    kJtMsg808LocationAlarmTirePressureWarning      = (1 << 16), ///< 1: 胎压预警
    kJtMsg808LocationAlarmAbnormalRightBlindArea   = (1 << 17), ///< 1: 右转盲区异常报警
    kJtMsg808LocationAlarmAccumDrvOverTime         = (1 << 18), ///< 1: 当天累计驾驶超时，标志维持至报警条件解除
    kJtMsg808LocationAlarmOvertimeParking          = (1 << 19), ///< 1: 超时停车，标志维持至报警条件解除
    kJtMsg808LocationAlarmInOutArea                = (1 << 20), ///< 1: 进出区域，收到应答后清零
    kJtMsg808LocationAlarmInOutLine                = (1 << 21), ///< 1: 进出线路，收到应答后清零
    kJtMsg808LocationAlarmSectionDrvTimeExcption   = (1 << 22), ///< 1: 路段行驶时间不足/过长，收到应答后清零
    kJtMsg808LocationAlarmDriftLine                = (1 << 23), ///< 1: 路线偏离报警，标志维持至报警条件解除
    kJtMsg808LocationAlarmVssFault                 = (1 << 24), ///< 1: 车辆VSS故障，标志维持至报警条件解除
    kJtMsg808LocationAlarmOilMass                  = (1 << 25), ///< 1: 车辆油量异常，标志维持至报警条件解除
    kJtMsg808LocationAlarmVehicleStolen            = (1 << 26), ///< 1: 车辆被盗（通过车辆防盗器），标志维持至报警条件解除
    kJtMsg808LocationAlarmVehicleIllegalIgnition   = (1 << 27), ///< 1: 车辆非法点火，收到应答后清零
    kJtMsg808LocationAlarmVehicleIllegalMoving     = (1 << 28), ///< 1: 车辆非法位移，收到应答后清零
    kJtMsg808LocationAlarmVehicleCrash             = (1 << 29), ///< 1: 碰撞报警，标志维持至报警条件解除
    kJtMsg808LocationAlarmCartwheel                = (1 << 30), ///< 1: 侧翻报警，标志维持至报警条件解除
};
typedef enum TJtMsg808LocationAlarmEnumTag TJtMsg808LocationAlarmEnum;

/**
 * 位置信息汇报附加信息定义id(0x0200)
 ******************************************************************************
 */
enum TJtMsg808LocationAdditionIdEnum
{
    kJtMsg808LocationAdditionIdMileage        = 0x01, ///< 4 | 里程，DWORD，1/10km，对应车上里程表读数
    kJtMsg808LocationAdditionIdOil            = 0x02, ///< 2 | 油量，WORD，1/10L，对应车上油量表读数
    kJtMsg808LocationAdditionIdSpeed          = 0x03, ///< 2 | 行驶记录功能获取的速度，WORD，1/10km/h
    kJtMsg808LocationAdditionIdManualAlarm    = 0x04, ///< 2 | 需要人工确认报警事件的ID，WORD，从1 开始计数
    kJtMsg808LocationAdditionIdOverSpeedAlarm = 0x11, ///< 1或5 | 超速报警附加信息见表28
    kJtMsg808LocationAdditionIdInOutLineAlarm = 0x12, ///< 6 | 进出区域/路线报警附加信息见表29
    kJtMsg808LocationAdditionIdDrvieTimeAlarm = 0x13, ///< 7 | 路段行驶时间不足/过长报警附加信息见表30
    kJtMsg808LocationAdditionIdVehicleStateEx = 0x25, ///< 4 | 扩展车辆信号状态位，定义见表31
    kJtMsg808LocationAdditionIdIoState        = 0x2A, ///< 2 | IO状态位，定义见表32
    kJtMsg808LocationAdditionIdAnalogValue    = 0x2B, ///< 4 | 模拟量，bit0-15，AD0；bit16-31，AD1。
    kJtMsg808LocationAdditionIdGsmCsq         = 0x30, ///< 1 | BYTE，无线通信网络信号强度
    kJtMsg808LocationAdditionIdSatelliteCount = 0x31, ///< 1 | BYTE，GNSS 定位卫星数
    kJtMsg808LocationAdditionIdCustomLen      = 0x32, ///< 后续信息长度 | 后续自定义信息长度
};


/**
 * 0x0200的gps项,标准28字节(0x0200)
 ******************************************************************************
 */
#pragma pack(push, 1)
typedef struct TJtMsg808LocationGpsItemTag TJtMsg808LocationGpsItem;
struct TJtMsg808LocationGpsItemTag
{
    DWord alarm_flag;                 ///< 报警标志 | 报警标志位定义见表7-16
    DWord state;                      ///< 状态 | 状态位定义见表7-15
    DWord latitude;                   ///< 纬度 | 以度为单位的纬度值乘以10的6次方，精确到百万分之一度
    DWord longitude;                  ///< 经度 | 以度为单位的经度值乘以10的6次方，精确到百万分之一度
    Word height;                      ///< 高程 | 海拔高度，单位为米（m）
    Word speed;                       ///< 速度 | 1/10km/h
    Word dir;                         ///< 方向 | 0～359，正北为0，顺时针
    Byte time[6];                     ///< 时间 | YY-MM-DD-hh-mm-ss（GMT+8时间，本标准中之后涉及的时间均采用此时区）
};
#pragma pack(pop)

/**
 * 人工确认报警类型定义(0x8203)
 ******************************************************************************
 */
enum TJtMsg808ManualAlarmBitEnumTag
{
    kJtMsg808ManualAlarmEmergency               = (1 << 0),  ///< 确认紧急报警
    kJtMsg808ManualAlarmEarly                   = (1 << 3),  ///< 确认危险预警
    kJtMsg808ManualAlarmInOutArea               = (1 << 20), ///< 确认进出区域报警
    kJtMsg808ManualAlarmInOutLine               = (1 << 21), ///< 确认进出路线报警
    kJtMsg808ManualAlarmSectionDrvTimeExcption  = (1 << 22), ///< 确认路段行驶时间不足/过长报警
    kJtMsg808ManualAlarmVehicleIllegalIgnition  = (1 << 27), ///< 确认车辆非法点火报警
    kJtMsg808ManualAlarmVehicleIllegalMoving    = (1 << 28), ///< 确认车辆非法位移报警
};
typedef enum TJtMsg808ManualAlarmBitEnumTag TJtMsg808ManualAlarmBitEnum;

/**
 * 文本信息标志位含义(0x8300)
 ******************************************************************************
 */
enum TJtMsg808TextMsgFlagEnumTag
{
    kJtMsg808TextMsgEmergency           = 0,    ///< 1：紧急
    kJtMsg808TextMsgTermDisplayer       = 2,    ///< 1：终端显示器显示
    kJtMsg808TextMsgTermTTSPlay         = 3,    ///< 1：终端TTS 播读
    kJtMsg808TextMsgAdvertisementDisplay= 4,    ///< 1：广告屏显示
    kJtMsg808TextMsgCenterNavigation    = 5,    ///< 0：中心导航信息，1：CAN 故障码信息
};
typedef enum TJtMsg808TextMsgFlagEnumTag TJtMsg808TextMsgFlagEnum;

/**
 * 事件设置的事件类型(0x8301)
 ******************************************************************************
 */
enum TJtMsg808EventSetTypeEnumTag
{
    kJtMsg808EventDeleteAll         = 0,            ///< 删除终端现有所有事件
    kJtMsg808EventUpdate            = 1,            ///< 更新事件:有则更新，无则增加
    kJtMsg808EventAdd               = 2,            ///< 增加事件:有则失败，无则增加
    kJtMsg808EventModify            = 3,            ///< 修改时间:有则修改，无则修改
    kJtMsg808EventDeleteSpecific    = 4,            ///< 删除特定的几个事件
};
typedef enum TJtMsg808EventSetTypeEnumTag TJtMsg808EventSetTypeEnum;


/**
 * 提问下发标志位定义(0x8302)
 ******************************************************************************
 */
enum TJtMsg808QuestionFlagEnumTag
{
    kJtMsg808QuestionEmergency      = (1 << 0),     ///< 1：紧急
    kJtMsg808QuestionTermDisplayer  = (1 << 3),     ///< 1：终端TTS 播读
    kJtMsg808QuestionTermTtsPlay    = (1 << 4),     ///< 1：广告屏显示
};
typedef enum TJtMsg808QuestionFlagEnumTag TJtMsg808QuestionFlagEnum;


/**
 * 信息点播菜单设置类型(0x8303)
 ******************************************************************************
 */
enum TJtMsg808MsgReqMenuSetTypeEnumTag
{
    kJtMsg808MsgReqMenuDeleteAll    = 0,    ///< 删除终端全部信息项
    kJtMsg808MsgReqMenuUpdate       = 1,    ///< 更新菜单
    kJtMsg808MsgReqMenuAdd          = 2,    ///< 追加菜单
    kJtMsg808MsgReqMenuModify       = 3,    ///< 修改菜单
};
typedef enum TJtMsg808MsgReqMenuSetTypeEnumTag TJtMsg808MsgReqMenuSetTypeEnum;

/**
 * 设置电话本类型(0x8401)
 ******************************************************************************
 */
enum TJtMsg808SetAddrBookTypeEnumTag
{
    kJtMsg808SetAddrBookDeleteAll   = 0,                ///< 删除终端上所有存储的联系人
    kJtMsg808SetAddrBookUpdate      = 1,                ///< 表示更新电话本（删除终端中已有全部联系人并追加消息中的联系人）
    kJtMsg808SetAddrBookAdd         = 2,                ///< 表示追加电话本
    kJtMsg808SetAddrBookModify      = 3,                ///< 表示修改电话本（以联系人为索引）
};
typedef enum TJtMsg808SetAddrBookTypeEnumTag TJtMsg808SetAddrBookTypeEnum;


/**
 * 圆形区域的区域项内容数据格式(0x8600)
 ******************************************************************************
 */
#pragma pack(push, 1)
typedef struct TJtMsg808CircleZoneTermTag TJtMsg808CircleZoneTerm;
struct TJtMsg808CircleZoneTermTag
{
    DWord id;                     ///< 区域id  
    Word attribute;               ///< 区域属性 | 区域属性定义见表8-49
    DWord center_lat;             ///< 中心点经度 | 以度为单位的纬度值乘以10的6次方，精确到百万分之一度
    DWord center_long;            ///< 中心店纬度 | 以度为单位的经度值乘以10的6次方，精确到百万分之一度
    DWord radius;                 ///< 半径 | 单位为米（m），路段为该拐点到下一拐点
    Byte start_time[6];           ///< 起始时间 | YY-MM-DD-hh-mm-ss，若区域属性0位为0则没有该字段
    Byte stop_time[6];            ///< 结束时间 | YY-MM-DD-hh-mm-ss，若区域属性0位为0则没有该字段
    Word limit_speed;             ///< 最高速度 | Km/h，若区域属性1位为0则没有该字段
    Byte over_speed_continue;     ///< 超速持续时间 | 单位为秒（s）（类似表述，同前修改），若区域属性1位为0则没有该字段
};
#pragma pack(pop)

/**
 * 区域设置动作类型枚举(0x8600)(0x8602)(0x8604)
 ******************************************************************************
 */
enum TJtMsg808ZoneSetActionEnumTag
{
    kJtMsg808ZoneSetActionUpdate = 0,                 ///< 有则更新，无则增加
    kJtMsg808ZoneSetActionAdd = 1,                    ///< 有则失败，无则增加
    kJtMsg808ZoneSetActionModify = 2,                 ///< 有则更新，无则失败
};
typedef enum TJtMsg808ZoneSetActionEnumTag TJtMsg808ZoneSetActionEnum;

/**
 * 区域的区域属性定义(0x8600)(0x8602)(0x8604)
 ******************************************************************************
 */
enum TJtMsg808ZoneActionEnumTag
{
    kJtMsg808ZoneActionTime                  = (1 << 0),    ///< 1：根据时间
    kJtMsg808ZoneActionLimitSpeed            = (1 << 1),    ///< 1：限速
    kJtMsg808ZoneActionInZoneAlarmDriver     = (1 << 2),    ///< 1：进区域报警给驾驶员
    kJtMsg808ZoneActionInZoneAlarmPtm        = (1 << 3),    ///< 1：进区域报警给平台
    kJtMsg808ZoneActionOutZoneAlarmDriver    = (1 << 4),    ///< 1：出区域报警给驾驶员
    kJtMsg808ZoneActionOutZoneAlarmPtm       = (1 << 5),    ///< 1：出区域报警给平台
    kJtMsg808ZoneActionLat                   = (1 << 6),    ///< 0：北纬；1：南纬
    kJtMsg808ZoneActionLong                  = (1 << 7),    ///< 0：东经；1：西经
    kJtMsg808ZoneActionOpenDoor              = (1 << 8),    ///< 0：允许开门；1：禁止开门
    kJtMsg808ZoneActionInZoneOpenModule      = (1 << 14),   ///< 0：进区域开启通信模块；1：进区域关闭通信模块
    kJtMsg808ZoneActionInZoneCollectGnssData = (1 << 15),   ///< 0：进区域不采集GNSS 详细定位数据；1：进区域采集GNSS 详细定位数据
};
typedef enum TJtMsg808ZoneActionEnumTag TJtMsg808ZoneActionEnum;

/**
 * 设置矩形区域消息体数据格式(0x8602)
 ******************************************************************************
 */
#pragma pack(push, 1)
typedef struct TJtMsg808RectZoneTermTag TJtMsg808RectZoneTerm;
struct TJtMsg808RectZoneTermTag
{
    DWord id;                       ///< 区域id  
    Word  attribute;                ///< 区域属性 | 区域属性定义见表8-59
    DWord left_up_lat;              ///< 以度为单位的纬度值乘以10的6次方，精确到百万分之一度
    DWord left_up_long;             ///< 以度为单位的经度值乘以10的6次方，精确到百万分之一度
    DWord right_down_lat;           ///< 以度为单位的纬度值乘以10的6次方，精确到百万分之一度
    DWord right_down_long;          ///< 以度为单位的经度值乘以10的6次方，精确到百万分之一度
    Byte  start_time[6];            ///< 起始时间 | YY-MM-DD-hh-mm-ss，若区域属性0位为0则没有该字段
    Byte  stop_time[6];             ///< 结束时间 | YY-MM-DD-hh-mm-ss，若区域属性0位为0则没有该字段
    Word  limit_speed;              ///< 最高速度 | Km/h，若区域属性1位为0则没有该字段
    Byte  over_speed_continue;      ///< 超速持续时间 | 单位为秒（s）（类似表述，同前修改），若区域属性1位为0则没有该字段
};
#pragma pack(pop)


/**
 * 设置多边形区域消息体数据格式 - 顶点项(0x8604)
 ******************************************************************************
 */
#pragma pack(push, 1)
typedef struct TJtMsg808PolygonPeakTermTag TJtMsg808PolygonPeakTerm;
struct TJtMsg808PolygonPeakTermTag
{
    DWord peak_lat;                ///< 以度为单位的纬度值乘以10的6次方，精确到百万分之一度
    DWord peak_long;               ///< 以度为单位的经度值乘以10的6次方，精确到百万分之一度
};
#pragma pack(pop)

/**
 * 路线属性数据格式(0x8606)
 ******************************************************************************
 */
enum TJtMsg808RoadAttrEnumTag
{
    kJtMsg808RoadAttrDriveTime  = (1 << 0),        ///< 1：行驶时间
    kJtMsg808RoadAttrLimitSpeed = (1 << 1),        ///< 1：限速
    kJtMsg808RoadAttrLat        = (1 << 2),        ///< 0：北纬；1：南纬
    kJtMsg808RoadAttrLong       = (1 << 3),        ///< 0：东经；1：西经
};
typedef enum TJtMsg808RoadAttrEnumTag TJtMsg808RoadAttrEnum;

/**
 * 路线拐点项数据格式(0x8606)
 ******************************************************************************
 */
#pragma pack(push, 1)
typedef struct TJtMsg808LineInflexionTermTag TJtMsg808LineInflexionTerm;
struct TJtMsg808LineInflexionTermTag
{
    DWord inflexion_id;            ///< 拐点id
    DWord road_id;                 ///< 路段id
    DWord latitude;                ///< 拐点纬度 | 以度为单位的纬度值乘以10的6次方，精确到百万分之一度
    DWord longitude;               ///< 拐点经度 | 以度为单位的经度值乘以10的6次方，精确到百万分之一度
    Byte road_width;               ///< 路段宽度 | 单位为米（m），路段为该拐点到下一拐点
    Byte road_attr;                ///< 路段属性 | 路段属性数据格式见表7-56
    Word driver_upper;             ///< 路段行驶过长阈值 | 单位为秒（s），若路段属性0位为0则没有该字段
    Word driver_lower;             ///< 路段行驶不足阈值 | 单位为秒（s），若路段属性0位为0则没有该字段
    Word limit_speed;              ///< 路段最高速度 | 单位为公里每小时（km/h），若路段属性1位为0则没有该字段
    Byte over_speed_continue;      ///< 路段超速持续时间 | 单位为秒（s），若路段属性1位为0则没有该字段
};
#pragma pack(pop)



/**
 * 表79 CAN 总线数据项数据格式(0x0705)
 ******************************************************************************
 */
typedef struct TJtMsg808CanDataItemTag TJtMsg808CanDataItem;
struct TJtMsg808CanDataItemTag
{
    DWord id;                     ///< bit31 表示CAN 通道号，0：CAN1，1：CAN2；
                                  ///< bit30 表示帧类型，0：标准帧，1：扩展帧；
                                  ///< bit29 表示数据采集方式，0：原始数据，1：采集区间的平均值；
                                  ///< bit28-bit0 表示CAN 总线id。
    Byte data[8];                 ///< CAN 数据
};

/**
 * 摄像头立即拍摄结果枚举(0x8801)
 ******************************************************************************
 */
enum TJtMsg808CameraSnapResultEnumTag
{ 
    kJtMsg808CameraSnapOK             = 0,  ///< 成功
    kJtMsg808CameraSnapFail           = 1,  ///< 失败
    kJtMsg808CameraSnapChNotExists    = 2,  ///< 通道不支持
};
typedef enum TJtMsg808CameraSnapResultEnumTag TJtMsg808CameraSnapResultEnum;

/**
 * 多媒体类型枚举(0x8802)
 ******************************************************************************
 */
enum TJtMsg808MediaTypeEnumTag
{
    kJtMsg808MediaTypeImage = 0,  ///< 图像
    kJtMsg808MediaTypeAudio = 1,  ///< 音频
    kJtMsg808MediaTypeVideo = 2,  ///< 视频
};
typedef enum TJtMsg808MediaTypeEnumTag TJtMsg808MediaTypeEnum;

/**
 * 多媒体事件项编码枚举(0x0800)
 ******************************************************************************
 */
enum TJtMsg808MediaEventCodeEnumTag
{
    kJtMsg808MediaEventCodePlatform     = 0,     ///< 平台下发指令
    kJtMsg808MediaEventCodeTiming       = 1,     ///< 定时动作
    kJtMsg808MediaEventCodeRobbery      = 2,     ///< 抢劫报警触发
    kJtMsg808MediaEventCodeAccident     = 3,     ///< 碰撞侧翻报警触发

    // 以下为2019标准协议新增
    kJtMsg808MediaEventCodeOpenDoor     = 4,     ///< 门开拍照
    kJtMsg808MediaEventCodeCloseDoor    = 5,     ///< 门关拍照
    kJtMsg808MediaEventCodeSpeedChange  = 6,     ///< 车门由开变关，车速从小于20km到超过20km
    kJtMsg808MediaEventCodeDistance     = 7,     ///< 定距拍照
};
typedef enum TJtMsg808MediaEventCodeEnumTag TJtMsg808MediaEventCodeEnum;

/**
 * 多媒体格式编码枚举(0x0800)
 ******************************************************************************
 */
enum TJtMsg808MediaEventFormatEnumTag
{
    kJtMsg808MediaEventFormatJpeg    = 0,     ///< JPEG
    kJtMsg808MediaEventFormatTif     = 1,     ///< TIF
    kJtMsg808MediaEventFormatMp3     = 2,     ///< MP3
    kJtMsg808MediaEventFormatWav     = 3,     ///< WAV
    kJtMsg808MediaEventFormatWmv     = 4,     ///< WMV
};
typedef enum TJtMsg808MediaEventFormatEnumTag TJtMsg808MediaEventFormatEnum;


/**
 * 表85 存储多媒体数据检索(0x8802)
 ******************************************************************************
 */
#pragma pack(push, 1)
typedef struct TJtMsg808MediaQueryItemTag TJtMsg808MediaQueryItem;
struct TJtMsg808MediaQueryItemTag
{
    Byte type;                        ///< 多媒体类型 | 0：图像；1：音频；2：视频；
    Byte channel_id;                  ///< 通道id | 0表示检索该媒体类型的所有通道；
    Byte event_code;                  ///< 事件项编码 | 0：平台下发指令；1：定时动作；2：抢劫报警触发；3：碰撞侧翻报警触发；其他保留
    Byte begin_time[6];               ///< 起始时间 | YY-MM-DD-hh-mm-ss
    Byte end_time[6];                 ///< 结束时间 | YY-MM-DD-hh-mm-ss
};
#pragma pack(pop)


/**
 * 表87 多媒体检索项数据格式(0x0802)
 ******************************************************************************
 */
#pragma pack(push, 1)
typedef struct TJtMsg808MediaQueryRespItemTag TJtMsg808MediaQueryRespItem;
struct TJtMsg808MediaQueryRespItemTag
{
    DWord mmid;             ///< 多媒体ID,值大于0
    Byte type;              ///< 多媒体类型,参考TJtMsg808MediaTypeEnum
    Byte channel_id;        ///< 通道号,值大于0,从1开始
    Byte event_code;        ///< 事件项编码,参考TJtMsg808MediaEventCodeEnum

    TJtMsg808LocationGpsItem local_item; ///< 标准28字节的位置信息
};
#pragma pack(pop)


/**
 * 表93 透传消息类型定义表（0x0900)(0x8900)
 ******************************************************************************
 */
enum TJtMsg808ByPassTypeEnumTag
{
    kJtMsg808ByPassTypeGnss = 0x00, ///< GNSS 模块详细定位数据 | GNSS 模块详细定位数据

    /// 道路运输证IC 卡信息 | 道路运输证IC卡信息上传消息为64Byte,下传消息为24Byte,道路运输证IC 卡认证透传超时时间为30s
    kJtMsg808ByPassTypeIcCard = 0x0B,
    kJtMsg808ByPassTypeUart1 = 0x41, ///< 串口1 透传消息
    kJtMsg808ByPassTypeUart2 = 0x42, ///< 串口2 透传消息

    kJtMsg808ByPassType0xFF = 0xFF, ///< 用户自定义透传消息,鸿泉EC2
    kJtMsg808BypassType0xC8 = 0xC8, ///< 用户自定义透传消息,鸿泉EC2

};
typedef enum TJtMsg808ByPassTypeEnumTag TJtMsg808ByPassTypeEnum;

#ifdef __cplusplus
} // extern "C" {
#endif

#endif
/**
 * @} 
 */

